﻿//Código desenvolvido na integra por João Ribeiro
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.Data.SqlServerCe;
using System.Data;
using System.Windows.Forms;

namespace GestaoContas
{
    class FichaEducando
    {
        private string _connectionStringJardimBD;

        public FichaEducando()
        {
            _connectionStringJardimBD = ConfigurationManager.ConnectionStrings["ConnectionStringJardimBD"].ConnectionString;
        }

        public FichaEducando(string nome, bool frequenta, DateTime dataNascimento, string observacoes, string path, int pessoaId)
        {
            _nome = nome;
            _frequenta = frequenta;
            _dataNascimento = dataNascimento;
            _observacoes = observacoes;
            _fotoPath = path;
            _pessoaId = pessoaId;
            _connectionStringJardimBD = ConfigurationManager.ConnectionStrings["ConnectionStringJardimBD"].ConnectionString;

        }

        public FichaEducando(int criancaId, string nome, bool frequenta, DateTime dataNascimento, string observacoes, string fotoPath, int fotoId, int pessoaId)
        {
            _criancaId = criancaId;
            _nome = nome;
            _frequenta = frequenta;
            _dataNascimento = dataNascimento;
            _observacoes = observacoes;
            _fotoPath = fotoPath;
            _fotoId = fotoId;
            _pessoaId = pessoaId;
            _connectionStringJardimBD = ConfigurationManager.ConnectionStrings["ConnectionStringJardimBD"].ConnectionString;
        }

        private int _criancaId;

        public int CriancaId
        {
            get { return _criancaId; }
            set { _criancaId = value; }
        }

        private string _nome;

        public string Nome
        {
            get { return _nome; }
            set { _nome = value; }
        }

        private bool _frequenta;

        public bool Frequenta
        {
            get { return _frequenta; }
            set { _frequenta = value; }
        }

        private DateTime _dataNascimento;

        public DateTime DataNascimento
        {
            get { return _dataNascimento; }
            set { _dataNascimento = value; }
        }

        private string _observacoes;

        public string Observacoes
        {
            get { return _observacoes; }
            set { _observacoes = value; }
        }

        private int _fotoId;

        public int FotoId
        {
            get { return _fotoId; }
            set { _fotoId = value; }
        }

        private string _fotoPath;

        public string FotoPath
        {
            get { return _fotoPath; }
            set { _fotoPath = value; }
        }

        private int _pessoaId;

        public int PessoaId
        {
            get { return _pessoaId; }
            set { _pessoaId = value; }
        }


        /// <summary>
        /// Preenche o Objecto educando.
        /// </summary>
        /// <param name="nomeEducando">Nome do educando</param>
        /// <returns>True, caso exista foto do educando inserida; False, caso contrário.</returns>
        public bool PreencheObjectoEducando(string nomeEducando)
        {
            string query = "SELECT CriancaId, Nome, DataNascimento, Frequenta, Observacoes FROM Crianca WHERE Nome = '" + nomeEducando + "'";
            bool existeFoto = true;

            SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);
            conn.Open();

            try
            {
                using (SqlCeCommand cmd = new SqlCeCommand(query, conn))
                {
                    using (SqlCeDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        reader.Read();
                        _criancaId = int.Parse(reader[0].ToString());
                        _nome = reader[1].ToString();
                        _dataNascimento = DateTime.Parse(reader[2].ToString());
                        _frequenta = Boolean.Parse(reader[3].ToString());
                        _observacoes = reader[4].ToString();

                        reader.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            conn.Close();

            conn = new SqlCeConnection(_connectionStringJardimBD);
            conn.Open();
            string queryfoto = "SELECT FotoId, Path FROM Foto WHERE Crianca_CriancaId = " + _criancaId + " AND Descricao = 'Foto de inscricao'";

            try
            {
                using (SqlCeCommand cmd = new SqlCeCommand(queryfoto, conn))
                {
                    using (SqlCeDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        reader.Read();
                        _fotoId = int.Parse(reader[0].ToString());
                        _fotoPath = reader[1].ToString();

                        reader.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                //MessageBox.Show(ex.Message);
                existeFoto = false;
            }
            conn.Close();

            return existeFoto;
        }

        /// <summary>
        /// Insere a foto da criança
        /// </summary>
        /// <param name="path">path da foto</param>
        /// <param name="criancaId">id da criança</param>
        /// <returns>True, caso o registo tenha sido feito com sucesso.</returns>
        public bool InsereFoto(string path, int criancaId)
        {
            bool fotoInserida = true;
            string insertString = @"INSERT INTO Foto (Path, DataFoto, Descricao, Crianca_CriancaId) ";
            insertString += "VALUES (@fotopath,@datafoto, @descricao, @criancaid)";

            try
            {
                SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);

                conn.Open();

                SqlCeCommand insertCommand = new SqlCeCommand(insertString, conn);

                insertCommand.Parameters.AddWithValue("@fotopath", path);
                insertCommand.Parameters.AddWithValue("@datafoto", DateTime.Now.Date);
                insertCommand.Parameters.AddWithValue("@descricao", "Foto de inscricao");
                insertCommand.Parameters.AddWithValue("@criancaid", criancaId);

                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters.Clear();
                insertCommand.Dispose();
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro na criação da foto!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                fotoInserida = false;
            }
            return fotoInserida;
        }

        /// <summary>
        /// Actualiza a foto do educando.
        /// </summary>
        /// <param name="path">path da foto</param>
        /// <param name="fotoId"></param>
        /// <returns>True, caso a alteração tenha sido bem sucedida.</returns>
        public bool updateFoto(string path, int fotoId)
        {
            bool fotoAlterada = true;
            string updateString = @"UPDATE Foto SET Path = @fotopath, DataFoto = @datafoto ";
            updateString += "WHERE FotoId = " + fotoId;

            try
            {
                SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);

                conn.Open();

                SqlCeCommand insertCommand = new SqlCeCommand(updateString, conn);

                insertCommand.Parameters.AddWithValue("@fotopath", path);
                insertCommand.Parameters.AddWithValue("@datafoto", DateTime.Now.Date);

                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters.Clear();
                insertCommand.Dispose();
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro na criação da foto!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                fotoAlterada = false;
            }
            return fotoAlterada;
        }

        /// <summary>
        /// Retorna o id do registo da criança que está a ser criada
        /// </summary>
        /// <returns></returns>
        private int BuscaIdCrianca()
        {
            string query = @"SELECT CriancaId FROM Crianca WHERE Nome = '" + _nome + "'";
            int criancaId = 0;

            SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);
            conn.Open();

            try
            {
                using (SqlCeCommand cmd = new SqlCeCommand(query, conn))
                {
                    using (SqlCeDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        reader.Read();
                        criancaId = int.Parse(reader[0].ToString());
                        reader.Close();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro na busca do criancaId!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            return criancaId;
        }

        /// <summary>
        /// Insere ou actualiza o educando na base de dados
        /// </summary>
        /// <param name="query">Query do insert ou update</param>
        /// <returns>True, se o insert ou update foi bem sucedido; False, caso contrário.</returns>
        private bool RegistoEducando(string query)
        {
            bool registoBemSucedido = true;

            try
            {
                SqlCeConnection conn = new SqlCeConnection(_connectionStringJardimBD);

                conn.Open();

                SqlCeCommand insertCommand = new SqlCeCommand(query, conn);

                insertCommand.Parameters.AddWithValue("@nome", _nome);
                if (_frequenta)
                {
                    insertCommand.Parameters.AddWithValue("@frequenta", 1);
                }
                else
                {
                    insertCommand.Parameters.AddWithValue("@frequenta", 0);
                }
                //DateTime data = new DateTime(dateTimePickerNascimento.Value.Year, dateTimePickerNascimento.Value.Month, dateTimePickerNascimento.Value.Day);
                //insertCommand.Parameters.AddWithValue("@data", data.ToString("s"));
                insertCommand.Parameters.AddWithValue("@data", _dataNascimento.ToString("s"));
                insertCommand.Parameters.AddWithValue("@observacoes", _observacoes);
                insertCommand.Parameters.AddWithValue("@pessoaid", _pessoaId);

                insertCommand.ExecuteNonQuery();
                insertCommand.Parameters.Clear();
                insertCommand.Dispose();
                conn.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Erro na criação do educando!", MessageBoxButtons.OK, MessageBoxIcon.Error);
                registoBemSucedido = false;
            }
            return registoBemSucedido;
        }

        /// <summary>
        /// Grava ou altera o registo de um educando
        /// </summary>
        /// <param name="altera">True, para alterar; False, para criar.</param>
        public bool GravaCrianca(bool altera)
        {
            bool criancaGravada = false;
            if (altera)
            {
                string updateString = @"UPDATE Crianca SET Nome = @nome, Frequenta = @frequenta, DataNascimento = @data, ";
                updateString += "Observacoes = @observacoes ";
                updateString += "WHERE CriancaId = " + _criancaId;

                if (RegistoEducando(updateString))
                {
                    criancaGravada = true;
                }
            }
            else
            {
                string insertString = @"INSERT INTO Crianca (Nome, Frequenta, DataNascimento, Observacoes, Pessoa_PessoaId) ";
                insertString += "VALUES (@nome, @frequenta, @data, @observacoes, @pessoaid)";

                if (RegistoEducando(insertString))
                {
                    if (_fotoPath != null)
                    {
                        InsereFoto(_fotoPath, BuscaIdCrianca());
                    }
                    criancaGravada = true;
                }
            }
            return criancaGravada;
        }

        /// <summary>
        /// Verifica se a ficha do educando foi alterada.
        /// </summary>
        /// <param name="fichaAntiga"></param>
        /// <returns></returns>
        public bool Igual(FichaEducando fichaAntiga)
        {
            bool fichaIgual = true;

            if (_nome != fichaAntiga.Nome ||
                _frequenta != fichaAntiga.Frequenta ||
                _observacoes != fichaAntiga.Observacoes ||
                _dataNascimento != fichaAntiga.DataNascimento)
            {
                fichaIgual = false;
            }

            return fichaIgual;
        }

        /// <summary>
        /// Verifica se a foto foi alterada.
        /// </summary>
        /// <param name="fichaAntiga"></param>
        /// <returns></returns>
        public bool FotoIgual(FichaEducando fichaAntiga)
        {
            bool fotoIgual = true;
            if (_fotoPath != fichaAntiga.FotoPath)
            {
                fotoIgual = false;
            }

            return fotoIgual;
        }
    }
}
